package com.chenziwen.scala.chapter08

object Scala15_Match1 {
  def main(args: Array[String]): Unit = {
    // 模式匹配，类似于Java的switch用法
    // Scala的模式匹配有截断功能，代码从上到下依次匹配，如果匹配到了，下面的不会再继续执行了
    var result = 0

    val c = '%'
    c match {
      case '+' => result = 1
      case '-' => result = 2
      case '*' => result = 3
      case '/' => result = 4
      // 模式匹配守卫
      case _ if (c.toString.equals("%")) => println("%%%%%%")
      case _ => result = 5
    }
    println(result)


    val str = "+-3!"
    for (i <- str.indices) {
      var sign = 0
      var digit = 0
      str(i) match {
        case '+' => sign = 1
        case '-' => sign = -1
        case ch if Character.isDigit(ch) => digit = Character.digit(ch, 10)
        case _ =>
      }
      println(str(i) + " " + sign + " " + digit)
    }

    // 类型匹配
    val a = 5
    val obj = if (a == 1) 1
    else if (a == 2) "2"
    else if (a == 3) BigInt(3)
    else if (a == 4) Map("aa" -> 1)
    else if (a == 5) Map(1 -> "aa")
    else if (a == 6) Array(1, 2, 3)
    else if (a == 7) Array("aa", 1)
    else if (a == 8) Array("aa")

    val result1 = obj match {
      case i: Int => i
      case _: BigInt => Int.MaxValue
      case m: Map[String, Int] => "对象是一个字符串-数字的Map集合"
      case m: Map[Int, String] => "对象是一个数字-字符串的Map集合"
      case a: Array[String] => "对象是一个字符串数组"
      case a: Array[Int] => "对象是一个数字数组"
      case _ => "啥也不是"
    }
    // Scala中模式匹配是忽略泛型的，所以上述例子中Map[String, Int]、Map[Int, String] 都是Map类型
    // 但是Array在底层翻译成Java程序时，变成的是int[] String[]，不存在泛型的概念，所以Array里面装的类型不同，结果也不同
    println(result1)
  }
}
